package com.lml.jdk8.localdate.java8Time;

import org.junit.jupiter.api.Test;

import java.sql.Timestamp;
import java.time.*;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

/**
 * @author luomingliang
 * @date 2021/9/12 22:07
 */
public class Java8TimeTransferDemo {

    //java.util.Date转换为java.time.LocalDate
    @Test
    public void test01() {
        //初始化Date对象
        Date d = new Date();
        //1.将Date对象转换为Instant对象
        Instant i = d.toInstant();
        //2.Date类包换日期和时间信息，但并不提供时区信息，和Instant类一样，通过Instant类的atZone方法添加时区信息进行转换
        ZonedDateTime zonedDateTime = i.atZone(ZoneId.systemDefault());
        //3.将ZonedDateTime通过toLocalDate方法转换为LocalDate对象
        LocalDate localDate = zonedDateTime.toLocalDate();
        System.out.println("转换之前的java.util.Date对象是：" + d);
        System.out.println("转换之后的java.time.LocalDate对象是：" + localDate);
    }

    //java.sql.Date转换为java.time.LocalDate
    @Test
    public void test02() {
        //初始化java.sql.Date对象
        java.sql.Date d = new java.sql.Date(System.currentTimeMillis());
        //java.sql.Timestamp类中也自带了LocalDate的方法，toLocalDate
        LocalDate localDate = d.toLocalDate();
        System.out.println("转换之前的java.sql.Date对象是：" + d);
        System.out.println("转换之后的java.time.LocalDate对象是：" + localDate);
    }

    //java.sql.Date转换为java.time.LocalDate
    @Test
    public void test03() {
        //初始化java.sql.Timestamp对象 -> 时间戳对象
        Timestamp t = new Timestamp(System.currentTimeMillis());
        //java.sql.Timestamp类中也自带了LocalDateTime的方法，toLocalDateTime
        LocalDateTime localDateTime = t.toLocalDateTime();
        System.out.println("转换之前的java.sql.Date对象是：" + t);
        System.out.println("转换之后的java.time.LocalDate对象是：" + localDateTime);
    }

    //java.util.Date转换为java.time.LocalDate的第二种方式
    @Test
    public void test04() {
        //初始化Date对象
        Date d = new Date();
        /*
        java.sql.Date类提供了转换为LocalDate的方法，那么可以将java.util.Date先转换为java.sql.Date，然后再转换为LocalDate
        java.sql.Date类构造的时候需要毫秒值 -> java.util.Date类中提供了一个获取毫秒值的方法，getTime
         */
        java.sql.Date sqlDate = new java.sql.Date(d.getTime());
        LocalDate localDate = sqlDate.toLocalDate();
        System.out.println("转换之前的java.util.Date对象是：" + d);
        System.out.println("转换之前的java.sql.Date对象是：" + sqlDate);
        System.out.println("转换之前的java.time.LocalDate对象是：" + localDate);
    }

    //Calendar对象转换为ZonedDateTime对象
    @Test
    public void test05() {
        //1.初始化Calendar对象
        Calendar cal = Calendar.getInstance();
        //2.Calendar对象自Java1.1版本开始提供了一个方法用于获取时区对象getTimeZone方法，要将Calendar转换为ZoneDateTime对象需要现货区到时区对象
        TimeZone timeZone = cal.getTimeZone();
        //3.从Java1.8开始TimeZone类提供一个方法可以获取到ZoneId -> 拿ZoneId对象来构建ZonedDateTime
        ZoneId zoneId = timeZone.toZoneId();
        //4.ZonedDateTime类有一个ofInstant方法，可以将一个Instant对象和ZoneId对象封装为一个ZonedDateTime
        ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(cal.toInstant(), zoneId);
        //提示：此外zonedDateTime可以转换为LocalDateTime、LocalDate、LocalTime
        System.out.println("转换之前的Calendar对象是：" + cal);
        System.out.println("转换之前的ZonedDateTime对象是：" + zonedDateTime);

        System.out.println("-----------------------------------");
        System.out.println("timeZone = " + timeZone);
        System.out.println("zoneId = " + zoneId);
    }

    //Calendar转换为LocalDateTime
    @Test
    public void test06() {
        //1.初始化Calendar对象
        Calendar cal = Calendar.getInstance();
        //2.通过Get方法获取Calendar对象中的封装数据
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH);
        int day = cal.get(Calendar.DAY_OF_MONTH);
        int hour = cal.get(Calendar.HOUR_OF_DAY);
        int minute = cal.get(Calendar.MINUTE);
        int second = cal.get(Calendar.SECOND);
        //3.将以上获取的6个参数作为LocalDateTime的of方法的参数进行传递
        //注意：这里的月份是从0开始的，所以获取到的month要+1
        LocalDateTime localDateTime = LocalDateTime.of(year, month + 1, day, hour, minute, second);
        System.out.println(localDateTime);
    }
}
